/* jshint unused: false */

// 导入koa，和koa 1.x不同，在koa2中，我们导入的是一个class，因此用大写的Koa表示:
const Koa = require('koa')
const router = require('koa-router')()
const bodyparser = require('koa-bodyparser')
const controller = require('./controller.js')

// 先导入fs模块，然后用readdirSync列出文件
// 这里可以用sync是因为启动时只运行一次，不存在性能问题:
var files = fs.readdirSync(__dirname + '/controllers')

// 过滤出.js文件:
var js_files = files.filter((f)=>{
  return f.endsWith('.js')
})

function addMapping(router, mapping) {
  for (var url in mapping) {
    if (url.startsWith('GET ')) {
      var path = url.substring(4)
      router.get(path, mapping[url])
      console.log(`register URL mapping: GET ${path}`)
    } else if (url.startsWith('POST ')) {
      var path = url.substring(5)
      router.post(path, mapping[url])
      console.log(`register URL mapping: POST ${path}`)
    } else {
      console.log(`invalid URL: ${url}`)
    }
  }
}

// 创建一个Koa对象表示web app本身:
const app = new Koa()

app.use(bodyparser())
app.use(controller())

/* jshint ignore:start */
app.use(async (ctx, next) => {
  console.log(`${ctx.request.method} ${ctx.request.url}`) // 打印URL
  await next() // 调用下一个middleware
})

app.use(router.routes())

app.use(async (ctx, next) => {
  const start = new Date().getTime() // 当前时间
  await next() // 调用下一个middleware
  const ms = new Date().getTime() - start // 耗费时间
  console.log(`Time: ${ms}ms`) // 打印耗费时间
})

// 对于任何请求，app将调用该异步函数处理请求：
app.use(async (ctx, next) => {
  await next()
  console.log('返回响应')
  ctx.response.type = 'text/html'
  ctx.response.body = '<h1>Hello, koa2!</h1>'
})
/* jshint ignore:end */

// 在端口3000监听:
app.listen(3000)
console.log('app started at port 3000...')